bitkeeper revision 1.1236.1.189 (424d776cRx8rE1fz0drKAs8qp8AVVw)
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 1 Apr 2005 16:31:40 +0000 (16:31 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 1 Apr 2005 16:31:40 +0000 (16:31 +0000)
I/O rings may now be dynamically sized: instead of declaring size
at struct definition time, declare it in FRONT/BACK_RING_INIT().
Signed-off-by: Keir Fraser <keir@xensource.com>
15 files changed:
freebsd-5.3-xen-sparse/i386-xen/i386-xen/ctrl_if.c
freebsd-5.3-xen-sparse/i386-xen/xen/blkfront/xb_blkfront.c
linux-2.6.11-xen-sparse/arch/xen/kernel/ctrl_if.c
linux-2.6.11-xen-sparse/drivers/xen/blkback/interface.c
linux-2.6.11-xen-sparse/drivers/xen/blkfront/blkfront.c
linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_controlmsg.c
linux-2.6.11-xen-sparse/drivers/xen/blktap/blktap_userdev.c
linux-2.6.11-xen-sparse/drivers/xen/usbback/interface.c
linux-2.6.11-xen-sparse/drivers/xen/usbfront/usbfront.c
tools/blktap/blktaplib.c
tools/xcs/ctrl_interface.c
xen/include/public/io/blkif.h
xen/include/public/io/domain_controller.h
xen/include/public/io/ring.h
xen/include/public/io/usbif.h

index 6c2f7df5015d5d27d2abb88da86ff947c72665d0..133734d028a6a6118d8e11b6d27d31e150ae553b 100644 (file)
@@ -470,8 +470,8 @@ ctrl_if_resume(void)
     
 
     /* Sync up with shared indexes. */
-    FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring);
-    BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring);
+    FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring, CONTROL_RING_MEM);
+    BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring, CONTROL_RING_MEM);
 
     ctrl_if_evtchn = xen_start_info->domain_controller_evtchn;
     ctrl_if_irq    = bind_evtchn_to_irq(ctrl_if_evtchn);
@@ -498,8 +498,8 @@ ctrl_if_init(void *dummy __unused)
     for ( i = 0; i < 256; i++ )
         ctrl_if_rxmsg_handler[i] = ctrl_if_rxmsg_default_handler;
     
-    FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring);
-    BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring);
+    FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring, CONTROL_RING_MEM);
+    BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring, CONTROL_RING_MEM);
 
     mtx_init(&ctrl_if_lock, "ctrlif", NULL, MTX_SPIN | MTX_NOWITNESS);
     
index d1117febf0a1211885e40c3f90bfaddf903d5478..a9e9b2cad1a5b2dbcddbac5b0a84320a160eb5f6 100644 (file)
@@ -102,8 +102,10 @@ static blkif_response_t blkif_control_rsp;
 
 static blkif_front_ring_t   blk_ring;
 
+#define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE)
+
 static unsigned long rec_ring_free;            
-blkif_request_t rec_ring[RING_SIZE(&blk_ring)];        /* shadow recovery ring */
+blkif_request_t rec_ring[BLK_RING_SIZE];
 
 /* XXX move to xb_vbd.c when VBD update support is added */
 #define MAX_VBDS 64
@@ -133,7 +135,7 @@ GET_ID_FROM_FREELIST( void )
 {
     unsigned long free = rec_ring_free;
 
-    KASSERT(free <= RING_SIZE(&blk_ring), ("free %lu > RING_SIZE", free));
+    KASSERT(free <= BLK_RING_SIZE, ("free %lu > RING_SIZE", free));
 
     rec_ring_free = rec_ring[free].id;
 
@@ -638,7 +640,7 @@ blkif_disconnect(void)
     if (blk_ring.sring) free(blk_ring.sring, M_DEVBUF);
     blk_ring.sring = (blkif_sring_t *)malloc(PAGE_SIZE, M_DEVBUF, M_WAITOK);
     SHARED_RING_INIT(blk_ring.sring);
-    FRONT_RING_INIT(&blk_ring, blk_ring.sring);
+    FRONT_RING_INIT(&blk_ring, blk_ring.sring, PAGE_SIZE);
     blkif_state  = BLKIF_STATE_DISCONNECTED;
     blkif_send_interface_connect();
 }
@@ -662,7 +664,7 @@ blkif_recover(void)
      * This will need to be fixed once we have barriers */
 
     /* Stage 1 : Find active and move to safety. */
-    for ( i = 0; i < RING_SIZE(&blk_ring); i++ ) {
+    for ( i = 0; i < BLK_RING_SIZE; i++ ) {
         if ( rec_ring[i].id >= KERNBASE ) {
            req = RING_GET_REQUEST(&blk_ring, 
                                    blk_ring.req_prod_pvt);
@@ -682,11 +684,11 @@ blkif_recover(void)
     }
 
     /* Stage 3 : Set up free list. */
-    for ( ; i < RING_SIZE(&blk_ring); i++ ){
+    for ( ; i < BLK_RING_SIZE; i++ ){
         rec_ring[i].id = i+1;
     }
     rec_ring_free = blk_ring.req_prod_pvt;
-    rec_ring[RING_SIZE(&blk_ring)-1].id = 0x0fffffff;
+    rec_ring[BLK_RING_SIZE-1].id = 0x0fffffff;
 
     /* blk_ring.req_prod will be set when we flush_requests().*/
     wmb();
@@ -874,10 +876,10 @@ xb_init(void *unused)
     printk("[XEN] Initialising virtual block device driver\n");
 
     rec_ring_free = 0;
-    for (i = 0; i < RING_SIZE(&blk_ring); i++) {
+    for (i = 0; i < BLK_RING_SIZE; i++) {
        rec_ring[i].id = i+1;
     }
-    rec_ring[RING_SIZE(&blk_ring)-1].id = 0x0fffffff;
+    rec_ring[BLK_RING_SIZE-1].id = 0x0fffffff;
 
     (void)ctrl_if_register_receiver(CMSG_BLKIF_FE, blkif_ctrlif_rx, 0);
 
index 81d3f36fd0de80bedccada934034520dbe1a6dea..c1cfb82dbdde1f89eeda4ddd2f48c4c26524fa9d 100644 (file)
@@ -503,8 +503,8 @@ void ctrl_if_resume(void)
     }
 
     /* Sync up with shared indexes. */
-    FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring);
-    BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring);
+    FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring, CONTROL_RING_MEM);
+    BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring, CONTROL_RING_MEM);
 
     ctrl_if_evtchn = xen_start_info.domain_controller_evtchn;
     ctrl_if_irq    = bind_evtchn_to_irq(ctrl_if_evtchn);
@@ -523,8 +523,8 @@ void __init ctrl_if_init(void)
     for ( i = 0; i < 256; i++ )
         ctrl_if_rxmsg_handler[i] = ctrl_if_rxmsg_default_handler;
 
-    FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring);
-    BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring);
+    FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring, CONTROL_RING_MEM);
+    BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring, CONTROL_RING_MEM);
     
     spin_lock_init(&ctrl_if_lock);
 
index 08c7a13267e5425f76b5d65c8ebaf8c2d443fe97..46d55d1fd484b6bac6594b237cf6639a0eaa8866 100644 (file)
@@ -198,7 +198,7 @@ void blkif_connect(blkif_be_connect_t *connect)
     }
     sring = (blkif_sring_t *)vma->addr;
     SHARED_RING_INIT(sring);
-    BACK_RING_INIT(&blkif->blk_ring, sring);
+    BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
     
     blkif->evtchn        = evtchn;
     blkif->irq           = bind_evtchn_to_irq(evtchn);
index 99ef532760457871bf05cd86c58e8808f211b8f3..03112d487b5435912147322c014bab1b0d9acfa9 100644 (file)
@@ -74,8 +74,10 @@ static blkif_response_t blkif_control_rsp;
 
 static blkif_front_ring_t blk_ring;
 
+#define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE)
+
 unsigned long rec_ring_free;
-blkif_request_t rec_ring[RING_SIZE(&blk_ring)];
+blkif_request_t rec_ring[BLK_RING_SIZE];
 
 static int recovery = 0;           /* "Recovery in progress" flag.  Protected
                                     * by the blkif_io_lock */
@@ -90,8 +92,7 @@ static inline int GET_ID_FROM_FREELIST( void )
 {
     unsigned long free = rec_ring_free;
 
-    if ( free > RING_SIZE(&blk_ring) )
-        BUG();
+    BUG_ON(free > BLK_RING_SIZE);
 
     rec_ring_free = rec_ring[free].id;
 
@@ -522,8 +523,7 @@ static void kick_pending_request_queues(void)
 {
     /* We kick pending request queues if the ring is reasonably empty. */
     if ( (nr_pending != 0) && 
-         (RING_PENDING_REQUESTS(&blk_ring) < 
-          (RING_SIZE(&blk_ring) >> 1)) )
+         (RING_PENDING_REQUESTS(&blk_ring) < (BLK_RING_SIZE >> 1)) )
     {
         /* Attempt to drain the queue, but bail if the ring becomes full. */
         while ( (nr_pending != 0) && !RING_FULL(&blk_ring) )
@@ -1138,7 +1138,7 @@ static void blkif_disconnect(void)
     
     sring = (blkif_sring_t *)__get_free_page(GFP_KERNEL);
     SHARED_RING_INIT(sring);
-    FRONT_RING_INIT(&blk_ring, sring);
+    FRONT_RING_INIT(&blk_ring, sring, PAGE_SIZE);
     blkif_state  = BLKIF_STATE_DISCONNECTED;
     blkif_send_interface_connect();
 }
@@ -1158,7 +1158,7 @@ static void blkif_recover(void)
      * This will need to be fixed once we have barriers */
 
     /* Stage 1 : Find active and move to safety. */
-    for ( i = 0; i < RING_SIZE(&blk_ring); i++ )
+    for ( i = 0; i < BLK_RING_SIZE; i++ )
     {
         if ( rec_ring[i].id >= PAGE_OFFSET )
         {
@@ -1179,10 +1179,10 @@ static void blkif_recover(void)
     }
 
     /* Stage 3 : Set up free list. */
-    for ( ; i < RING_SIZE(&blk_ring); i++ )
+    for ( ; i < BLK_RING_SIZE; i++ )
         rec_ring[i].id = i+1;
     rec_ring_free = blk_ring.req_prod_pvt;
-    rec_ring[RING_SIZE(&blk_ring)-1].id = 0x0fffffff;
+    rec_ring[BLK_RING_SIZE-1].id = 0x0fffffff;
 
     /* blk_ring->req_prod will be set when we flush_requests().*/
     wmb();
@@ -1369,9 +1369,9 @@ int __init xlblk_init(void)
     printk(KERN_INFO "xen_blk: Initialising virtual block device driver\n");
 
     rec_ring_free = 0;
-    for ( i = 0; i < RING_SIZE(&blk_ring); i++ )
+    for ( i = 0; i < BLK_RING_SIZE; i++ )
         rec_ring[i].id = i+1;
-    rec_ring[RING_SIZE(&blk_ring)-1].id = 0x0fffffff;
+    rec_ring[BLK_RING_SIZE-1].id = 0x0fffffff;
 
     (void)ctrl_if_register_receiver(CMSG_BLKIF_FE, blkif_ctrlif_rx,
                                     CALLBACK_IN_BLOCKING_CONTEXT);
index 8d68cd8c40d43b5dbc9d7ff73eaa02d4385e4e73..9b6272f369bf128aa348eca8640545bf04426aa8 100644 (file)
@@ -229,7 +229,7 @@ void blkif_ptfe_connect(blkif_be_connect_t *connect)
 
     sring = (blkif_sring_t *)vma->addr;
     SHARED_RING_INIT(sring);
-    BACK_RING_INIT(&blkif->blk_ring, sring);
+    BACK_RING_INIT(&blkif->blk_ring, sring, PAGE_SIZE);
     
     blkif->evtchn        = evtchn;
     blkif->irq           = bind_evtchn_to_irq(evtchn);
@@ -302,7 +302,7 @@ static void blkif_ptbe_disconnect(void)
     
     sring = (blkif_sring_t *)__get_free_page(GFP_KERNEL);
     SHARED_RING_INIT(sring);
-    FRONT_RING_INIT(&blktap_be_ring, sring);
+    FRONT_RING_INIT(&blktap_be_ring, sring, PAGE_SIZE);
     blktap_be_state  = BLKIF_STATE_DISCONNECTED;
     DPRINTK("Blkif-Passthrough-BE is now DISCONNECTED.\n");
     blkif_ptbe_send_interface_connect();
index 93594623b0030972c9832089e6d38300060d75b6..31d683041775e06d949f51d65b5811bb4be03170 100644 (file)
@@ -87,8 +87,7 @@ static int blktap_open(struct inode *inode, struct file *filp)
     SetPageReserved(virt_to_page(csring));
     
     SHARED_RING_INIT(csring);
-    FRONT_RING_INIT(&blktap_uctrl_ring, csring);
-
+    FRONT_RING_INIT(&blktap_uctrl_ring, csring, PAGE_SIZE);
 
     /* Allocate the fe ring. */
     sring = (blkif_sring_t *)get_zeroed_page(GFP_KERNEL);
@@ -98,7 +97,7 @@ static int blktap_open(struct inode *inode, struct file *filp)
     SetPageReserved(virt_to_page(sring));
     
     SHARED_RING_INIT(sring);
-    FRONT_RING_INIT(&blktap_ufe_ring, sring);
+    FRONT_RING_INIT(&blktap_ufe_ring, sring, PAGE_SIZE);
 
     /* Allocate the be ring. */
     sring = (blkif_sring_t *)get_zeroed_page(GFP_KERNEL);
@@ -108,7 +107,7 @@ static int blktap_open(struct inode *inode, struct file *filp)
     SetPageReserved(virt_to_page(sring));
     
     SHARED_RING_INIT(sring);
-    BACK_RING_INIT(&blktap_ube_ring, sring);
+    BACK_RING_INIT(&blktap_ube_ring, sring, PAGE_SIZE);
 
     DPRINTK(KERN_ALERT "blktap open.\n");
 
index 4630da8951add4d6e2c6fd46278fc1a32e8d6076..c1a16e800080730608114657566668913f328089 100644 (file)
@@ -195,7 +195,7 @@ void usbif_connect(usbif_be_connect_t *connect)
 
     sring = (usbif_sring_t *)vma->addr;
     SHARED_RING_INIT(sring);
-    BACK_RING_INIT(&up->usb_ring, sring);
+    BACK_RING_INIT(&up->usb_ring, sring, PAGE_SIZE);
 
     up->evtchn        = evtchn;
     up->irq           = bind_evtchn_to_irq(evtchn);
index b5e98e4d0608707f41df90c9778fc4fdba4b23e8..6a517b13bc69e14734c9c77da8280c073e7dd3f4 100644 (file)
@@ -1549,7 +1549,7 @@ static void usbif_status_change(usbif_fe_interface_status_changed_t *status)
         /* Move from CLOSED to DISCONNECTED state. */
         sring = (usbif_sring_t *)__get_free_page(GFP_KERNEL);
         SHARED_RING_INIT(sring);
-        FRONT_RING_INIT(&xhci->usb_ring, sring);
+        FRONT_RING_INIT(&xhci->usb_ring, sring, PAGE_SIZE);
         xhci->state  = USBIF_STATE_DISCONNECTED;
 
         /* Construct an interface-CONNECT message for the domain controller. */
index 87b680d2cc64d8b0859d3074df76c8fc211835d1..ea8b1238eefc90e18adff0f535842ce66cae96ce 100644 (file)
@@ -385,13 +385,13 @@ int blktap_listen(void)
 
     /* assign the rings to the mapped memory */
     csring = (ctrl_sring_t *)blktap_mem;
-    BACK_RING_INIT(&ctrl_ring, csring);
+    BACK_RING_INIT(&ctrl_ring, csring, CONTROL_RING_MEM);
     
     sring = (blkif_sring_t *)((unsigned long)blktap_mem + PAGE_SIZE);
-    FRONT_RING_INIT(&be_ring, sring);
+    FRONT_RING_INIT(&be_ring, sring, PAGE_SIZE);
     
     sring = (blkif_sring_t *)((unsigned long)blktap_mem + (2 *PAGE_SIZE));
-    BACK_RING_INIT(&fe_ring, sring);
+    BACK_RING_INIT(&fe_ring, sring, PAGE_SIZE);
 
     mmap_vstart = (unsigned long)blktap_mem + (BLKTAP_RING_PAGES << PAGE_SHIFT);
     
index b2fbad998aef90a22bae859653e562bc69e5194a..76271526cde405d325b44c3b93aa16eab68e816d 100644 (file)
@@ -186,8 +186,8 @@ int ctrl_chan_connect(control_channel_t *cc)
     }
 
     /* Synchronise ring indexes. */
-    BACK_RING_ATTACH(&cc->tx_ring, &cc->interface->tx_ring);
-    FRONT_RING_ATTACH(&cc->rx_ring, &cc->interface->rx_ring);
+    BACK_RING_ATTACH(&cc->tx_ring, &cc->interface->tx_ring, CONTROL_RING_MEM);
+    FRONT_RING_ATTACH(&cc->rx_ring, &cc->interface->rx_ring, CONTROL_RING_MEM);
 
     cc->connected = 1;
 
index 95b74b71b9833331fc3b71ecd0202ccb86f23022..836b8936e793199e63ef6114d167e661d208a06e 100644 (file)
@@ -57,7 +57,7 @@ typedef struct {
  * Generate blkif ring structures and types.
  */
 
-DEFINE_RING_TYPES(blkif, blkif_request_t, blkif_response_t, PAGE_SIZE);
+DEFINE_RING_TYPES(blkif, blkif_request_t, blkif_response_t);
 
 /*
  * BLKIF_OP_PROBE:
index d7d5efadb5225b0eec1eeeaefbc0bcc428389826..a4fdd63ad0029d9ef5b51537599b98dc4fd65b4e 100644 (file)
@@ -36,11 +36,17 @@ typedef u32 CONTROL_RING_IDX;
  * two 32-bit counters:  (64 * 8) + (2 * 4) = 520
  */
 #define CONTROL_RING_MEM 520
-DEFINE_RING_TYPES(ctrl, control_msg_t, control_msg_t, CONTROL_RING_MEM);
+DEFINE_RING_TYPES(ctrl, control_msg_t, control_msg_t);
 
 typedef struct {
-    ctrl_sring_t tx_ring; /*    0: guest -> controller  */
-    ctrl_sring_t rx_ring; /*  520: controller -> guest  */
+    union {
+        ctrl_sring_t tx_ring; /*    0: guest -> controller  */
+        char __x[CONTROL_RING_MEM];
+    } PACKED;
+    union {
+        ctrl_sring_t rx_ring; /*  520: controller -> guest  */
+        char __y[CONTROL_RING_MEM];
+    } PACKED;
 } PACKED control_if_t; /* 1040 bytes */
 
 /*
index eb0179249cb5baa7507d8c0b33e2420005f6d475..68970f039953162ab24aba16239095d209c0ec54 100644 (file)
@@ -18,23 +18,21 @@ typedef unsigned int RING_IDX;
 /*
  * Calculate size of a shared ring, given the total available space for the
  * ring and indexes (_sz), and the name tag of the request/response structure.
- * S ring contains as many entries as will fit, rounded down to the nearest 
+ * A ring contains as many entries as will fit, rounded down to the nearest 
  * power of two (so we can mask with (size-1) to loop around).
  */
-#define __RING_SIZE(_name, _sz)                                         \
-    (__RD32(((_sz) - 2*sizeof(RING_IDX)) / sizeof(union _name##_sring_entry)))
+#define __RING_SIZE(_s, _sz) \
+    (__RD32(((_sz) - 2*sizeof(RING_IDX)) / sizeof((_s)->ring[0])))
 
 /*
  *  Macros to make the correct C datatypes for a new kind of ring.
  * 
  *  To make a new ring datatype, you need to have two message structures,
- *  let's say request_t, and response_t already defined.  You also need to
- *  know how big the shared memory region you want the ring to occupy is
- *  (PAGE_SIZE, of instance).
+ *  let's say request_t, and response_t already defined.
  *
  *  In a header where you want the ring datatype declared, you then do:
  *
- *     DEFINE_RING_TYPES(mytag, request_t, response_t, PAGE_SIZE);
+ *     DEFINE_RING_TYPES(mytag, request_t, response_t);
  *
  *  These expand out to give you a set of types, as you can see below.
  *  The most important of these are:
@@ -43,35 +41,38 @@ typedef unsigned int RING_IDX;
  *     mytag_front_ring_t - The 'front' half of the ring.
  *     mytag_back_ring_t  - The 'back' half of the ring.
  *
- *  To initialize a ring in your code, on the front half, you do:
+ *  To initialize a ring in your code you need to know the location and size
+ *  of the shared memory area (PAGE_SIZE, for instance). To initialise
+ *  the front half:
  *
  *      mytag_front_ring_t front_ring;
  *
  *      SHARED_RING_INIT((mytag_sring_t *)shared_page);
- *      FRONT_RING_INIT(&front_ring, (mytag_sring_t *)shared_page);
+ *      FRONT_RING_INIT(&front_ring, (mytag_sring_t *)shared_page, PAGE_SIZE);
  *
  *  Initializing the back follows similarly...
  */
          
-#define DEFINE_RING_TYPES(__name, __req_t, __rsp_t, __size)             \
+#define DEFINE_RING_TYPES(__name, __req_t, __rsp_t)                     \
                                                                         \
 /* Shared ring entry */                                                 \
 union __name##_sring_entry {                                            \
     __req_t req;                                                        \
     __rsp_t rsp;                                                        \
-} PACKED;                                                               \
+};                                                                      \
                                                                         \
 /* Shared ring page */                                                  \
 struct __name##_sring {                                                 \
     RING_IDX req_prod;                                                  \
     RING_IDX rsp_prod;                                                  \
-    union __name##_sring_entry ring[__RING_SIZE(__name, __size)];       \
-} PACKED;                                                               \
+    union __name##_sring_entry ring[1]; /* variable-length */           \
+};                                                                      \
                                                                         \
 /* "Front" end's private variables */                                   \
 struct __name##_front_ring {                                            \
     RING_IDX req_prod_pvt;                                              \
     RING_IDX rsp_cons;                                                  \
+    unsigned int nr_ents;                                               \
     struct __name##_sring *sring;                                       \
 };                                                                      \
                                                                         \
@@ -79,6 +80,7 @@ struct __name##_front_ring {                                            \
 struct __name##_back_ring {                                             \
     RING_IDX rsp_prod_pvt;                                              \
     RING_IDX req_cons;                                                  \
+    unsigned int nr_ents;                                               \
     struct __name##_sring *sring;                                       \
 };                                                                      \
                                                                         \
@@ -102,41 +104,44 @@ typedef struct __name##_back_ring __name##_back_ring_t;
  *   outstanding requests.
  */
 
-
 /* Initialising empty rings */
 #define SHARED_RING_INIT(_s) do {                                       \
     (_s)->req_prod = 0;                                                 \
     (_s)->rsp_prod = 0;                                                 \
 } while(0)
 
-#define FRONT_RING_INIT(_r, _s) do {                                    \
+#define FRONT_RING_INIT(_r, _s, __size) do {                            \
     (_r)->req_prod_pvt = 0;                                             \
     (_r)->rsp_cons = 0;                                                 \
+    (_r)->nr_ents = __RING_SIZE(_s, __size);                            \
     (_r)->sring = (_s);                                                 \
 } while (0)
 
-#define BACK_RING_INIT(_r, _s) do {                                     \
+#define BACK_RING_INIT(_r, _s, __size) do {                             \
     (_r)->rsp_prod_pvt = 0;                                             \
     (_r)->req_cons = 0;                                                 \
+    (_r)->nr_ents = __RING_SIZE(_s, __size);                            \
     (_r)->sring = (_s);                                                 \
 } while (0)
 
 /* Initialize to existing shared indexes -- for recovery */
-#define FRONT_RING_ATTACH(_r, _s) do {                                  \
+#define FRONT_RING_ATTACH(_r, _s, __size) do {                          \
     (_r)->sring = (_s);                                                 \
     (_r)->req_prod_pvt = (_s)->req_prod;                                \
     (_r)->rsp_cons = (_s)->rsp_prod;                                    \
+    (_r)->nr_ents = __RING_SIZE(_s, __size);                            \
 } while (0)
 
-#define BACK_RING_ATTACH(_r, _s) do {                                   \
+#define BACK_RING_ATTACH(_r, _s, __size) do {                           \
     (_r)->sring = (_s);                                                 \
     (_r)->rsp_prod_pvt = (_s)->rsp_prod;                                \
     (_r)->req_cons = (_s)->req_prod;                                    \
+    (_r)->nr_ents = __RING_SIZE(_s, __size);                            \
 } while (0)
 
 /* How big is this ring? */
 #define RING_SIZE(_r)                                                   \
-    (sizeof((_r)->sring->ring)/sizeof((_r)->sring->ring[0]))
+    ((_r)->nr_ents)
 
 /* How many empty slots are on a ring? */
 #define RING_PENDING_REQUESTS(_r)                                       \
index 7fb554607a7c688a00daa2856a7450b445c3b119..ff4e1480f23d8cd5db4720542a1ef9cb94078915 100644 (file)
 #define USBIF_OP_RESET   2 /* Reset a virtual USB port.       */
 
 typedef struct {
-    unsigned long  id;           /*  0: private guest value, echoed in resp  */
-    u8             operation;    /*  4: USBIF_OP_???                         */
+    unsigned long  id;           /* private guest value, echoed in resp  */
+    u8             operation;    /* USBIF_OP_???                         */
     u8  __pad1;
-    usbif_vdev_t   port;         /* 6 : guest virtual USB port               */
-    unsigned long  devnum :7;    /* 8 : Device address, as seen by the guest.*/
+    usbif_vdev_t   port;         /* guest virtual USB port               */
+    unsigned long  devnum :7;    /* Device address, as seen by the guest.*/
     unsigned long  endpoint :4;  /* Device endpoint.                         */
     unsigned long  direction :1; /* Pipe direction.                          */
     unsigned long  speed :1;     /* Pipe speed.                              */
     unsigned long  pipe_type :2; /* Pipe type (iso, bulk, int, ctrl)         */
     unsigned long  __pad2 :18;
-    unsigned long  transfer_buffer; /* 12: Machine address */
-    unsigned long  length;          /* 16: Buffer length */
-    unsigned long  transfer_flags;  /* 20: For now just pass Linux transfer
+    unsigned long  transfer_buffer; /* Machine address */
+    unsigned long  length;          /* Buffer length */
+    unsigned long  transfer_flags;  /* For now just pass Linux transfer
                                      * flags - this may change. */
-    unsigned char setup[8];         /* 22 Embed setup packets directly. */
-    unsigned long  iso_schedule;    /* 30 Machine address of transfer sched (iso
+    unsigned char setup[8];         /* Embed setup packets directly. */
+    unsigned long  iso_schedule;    /* Machine address of transfer sched (iso
                                      * only) */
-    unsigned long num_iso;        /* 34 : length of iso schedule */
-    unsigned long timeout;        /* 38: timeout in ms */
-} PACKED usbif_request_t; /* 42 */
+    unsigned long num_iso;        /* length of iso schedule */
+    unsigned long timeout;        /* timeout in ms */
+} usbif_request_t;
 
 /* Data we need to pass:
  * - Transparently handle short packets or complain at us?
  */
 
 typedef struct {
-    unsigned long   id;              /* 0: copied from request         */
-    u8              operation;       /* 4: copied from request         */
-    u8              data;            /* 5: Small chunk of in-band data */
-    s16             status;          /* 6: USBIF_RSP_???               */
+    unsigned long   id;              /* copied from request         */
+    u8              operation;       /* copied from request         */
+    u8              data;            /* Small chunk of in-band data */
+    s16             status;          /* USBIF_RSP_???               */
     unsigned long   transfer_mutex;  /* Used for cancelling requests atomically. */
-    unsigned long    length;          /* 8: How much data we really got */
-} PACKED usbif_response_t;
+    unsigned long    length;         /* How much data we really got */
+} usbif_response_t;
 
 #define USBIF_RSP_ERROR  -1 /* non-specific 'error' */
 #define USBIF_RSP_OKAY    0 /* non-specific 'okay'  */
 
-DEFINE_RING_TYPES(usbif, usbif_request_t, usbif_response_t, PAGE_SIZE);
+DEFINE_RING_TYPES(usbif, usbif_request_t, usbif_response_t);
 
 typedef struct {
     unsigned long length; /* IN = expected, OUT = actual */